There are currently two conventional techniques used by programmers to debug computer software code. These techniques include program monitors and microprocessor emulators.
A program monitor is intrusive software code located in target memory to debug computer programs. The program monitor operates in conjunction with and monitors the operation of a main computer program that controls the functions of a microprocessor-based target circuit. The program monitor code is intrusive in that it is linked to the main program code, both of which are either downloaded into memory sites provided in the target circuit or stored in a read only memory (ROM) used by the programmer. The use of a monitor program requires that a universal asynchronous receiver-transmitter or other communication hardware be provided in the target circuit so that the monitor can communicate apart from the main program to the programmer.
The use of program monitors is advantageous because they are relatively inexpensive and find the majority of errors or "bugs" located in the main program. One drawback of program monitors is that they require the use of resources in the target circuit and typically are ineffective in detecting more difficult problems present in the associated program code.
An emulator is a nonintrusive software debugging tool that uses external hardware to provide transparent operation of a microprocessor embedded in a target circuit. The emulator microprocessor substitutes for the target microprocessor during target circuit testing and execution, and the emulator traces all activity that occurs at the target microprocessor input and output terminals. An emulator provides a complex breakpoint system that monitors the target microprocessor activity and stops the microprocessor operations at predetermined points for analysis of certain target circuit signals.
An emulator is designed for use primarily in full system integration and for solving real-time problems. A programmer using an emulator is able to replace the programmer's ancillary ROM with an overlay random access memory (RAM) located in the emulator. The overlay RAM allows the programmer to debug the program code even when the target circuit is not complete physically and thereby shortens the development time of microprocessor-embedded circuits. Certain types of emulators do not require the use of the target resources; therefore, such emulators can be viewed as nonintrusive code debugging instruments.
An emulator addresses the needs of the integration phase and time-dependent problems in a target circuit by using a trace feature, complex breakpoint systems, and an overlay memory. Because each of these features is expensive but critical for full system integration, such features are not necessary for run-time debugging. Thus, one major drawback of emulators is that they are relatively expensive, thereby making them inaccessible to a significant percentage of the growing number of software engineers participating in microprocessor-based circuit design tasks.